//
// JavaXVL3 Processorp̑Ŝ̗ij
//

import  jp.co.lattice.vProcessor.base.*;			// JavaXVL3 ProcessorpbP[W
import  jp.co.lattice.vProcessor.com.*;				// 

import  jp.co.lattice.vkernel.b0.*;					// Java Lattice KernelpbP[W
import  jp.co.lattice.vkernel.c0.*;					// 


class XVL3Example {

x3pGlobal  mX3pGlobal;								// XVL3 ProcessorO[o


// S
//			applet:				Avbg
//			xvl3FileName:		XVL3t@C
//			numDivEdgeOnGreg:	Ő
public void Proc( Applet appletAString xvl3FileName, int numDivEdgeOnGreg ) throws Throwable
{
    Init();											// 

    // Processorւ̃f[^o
    ToProcessor( applet xvl3FileName, numDivEdgeOnGreg );

    // Processor̃f[^擾
    x3pFromProcessor  fromProcessor = FromProcessor();

    // fromProcessor烆[U[vOf[^ւ̕ϊ
    Convert( fromProcessor );

    fromProcessor = null;          					// ȌAKvȂĂ悢
}

// 
public void Init()
{
    mX3pGlobal = x3pWorld.Init();					// 
}

// Processorւ̃f[^o
public void ToProcessor( Applet appletAString xvl3FileName, int numDivEdgeOnGreg ) throws Throwable
{
    // u Processorւ̃f[^óvpNX쐬
    x3pToProcessor  toProcessor = new x3pToProcessor( mX3pGlobal );

    // XVL3t@CURL𓾂
    URL  xvl3FileUrl;
    try { 
        xvl3FileUrl = new URL( applet.getDocumentBase(), xvl3FileName );
    }
    catch( Exception e ) {
        System.out.println( e.getMessage() );
        throw new Throwable();
    }

    // uProcessorւ̃f[^vLq
    toProcessor.xvl3FileUrl      = xvl3FileUrl;
    toProcessor.numDivEdgeOnGreg = numDivEdgeOnGreg;

    // Processorւ̃f[^o
    boolean  result = toProcessor.SetData();
    if( result == lvConst.LV_FAILURE ) {
        System.out.println( lvError.Message( mX3pGlobal ) );
        throw new Throwable();
    }

    toProcessor = null;								// toProcessoŕÂƕsgp
}

 // Processor̃f[^擾
public x3pFromProcessor FromProcessor() throws Throwable
{
    // uProcessor̃f[^擾vpNX쐬
    x3pFromProcessor  fromProcessor = new x3pFromProcessor( mX3pGlobal );

    // Processor̃f[^擾
    boolean  result = fromProcessor.GetData();
    if( result == lvConst.LV_FAILURE ) {
        System.out.println( lvError.Message( mX3pGlobal ) );
        throw new Throwable();
    }

    return fromProcessor;							// uProcessor̃f[^vԂ
}

// fromProcessor烆[U[vOf[^ւ̕ϊ
public void Convert( x3pFromProcessor fromProcessor )
{
    // VFPʂ̃[v
    for( int i=0; i<fromProcessor.shellInfo.length; i++ ) {

        // VF擾
        x3pShellInfo  shellInfo = fromProcessor.shellInfo[ i ];

        // CX^XPʂ̃[v
        for( int j=0; j<shellInfo.instance.length; j++ ) {

            // FacesPʂ̃[v
            for( int k=0; k<shellInfo.faces.length; k++ )
                ConvertFaces( fromProcessor, shellInfo.faces[ k ], shellInfo.instance[ j ] );
        }
    }
}

// fromProcessor烆[U[vOf[^ւ̕ϊiFacesPʁj
public void ConvertFaces( x3pFromProcessor fromProcessor, x3pShellInfo.Faces faces,
                          x3pShellInfo.Instance instance )
{
    // fromProcessor烆[U[vOf[^ւ̕ϊi}eAPʁj
    ConvertMaterial( fromProcess.material[ faces.materialIndex ] );

    // fromProcessor烆[U[vOf[^ւ̕ϊieNX`Pʁj
    if( fromProcess.texture != null && faces.enableTextue == true )
        ConvertTexture( fromProcess.texture[ faces.textureIndex ] );

    // ʒPʂ̃[v
    for( int i=0; i<faces.fromKernel.length; i++ ) {
        ConvertSurface( faces.fromKernel[ i ], faces.face[ i ], instance );
    }
}

// fromProcessor烆[U[vOf[^ւ̕ϊi}eAPʁj
public void ConvertMaterial( x3pFromProcessor.Material material )
{
    ... = material.ambientIntensity;				// ̗

    ... = material.diffuseColor.r;					// gUˌF
    ... = material.diffuseColor.g;
    ... = material.diffuseColor.b;

    ... = material.emissiveColor.r;					// F
    ... = material.emissiveColor.g;
    ... = material.emissiveColor.b;

    ... = material.shininess;						// ʔ˂̉s

    ... = material.specularColor.r; 				// ʔˌF
    ... = material.specularColor.g;
    ... = material.specularColor.b;

    ... = material.transparency;					// x
}

// fromProcessor烆[U[vOf[^ւ̕ϊieNX`Pʁj
public void ConvertTexture( x3pFromProcessor.Texture texture )
{
    ... = texture.url;								// eNX`t@CURL
    ... = texture.repeatS;							// SJԂtO
    ... = texture.repeatT;							// TJԂtO
}

 // fromProcessor烆[U[vOf[^ւ̕ϊiʒPʁj
public void ConvertSurface( lvFromKernel fromKernel, x3pShellInfo.Face face,
                            x3pShellInfo.Instance instance )
{
    // _Pʂ̃[v
    for( int i=0; i<fromKernel.vertex.length; i++ ) {

        // fromProcessor烆[U[vOf[^ւ̕ϊi_ʒuPʁj
        ConvertPos( fromKernel.vertex[ i ].pos.x,
                    fromKernel.vertex[ i ].pos.y,
                    fromKernel.vertex[ i ].pos.z,
                    instance.posMat );

        // fromProcessor烆[U[vOf[^ւ̕ϊi_@Pʁj
        ConvertNormal( fromKernel.vertex[ i ].normal.x,
                       fromKernel.vertex[ i ].normal.y,
                       fromKernel.vertex[ i ].normal.z,
                       instance.normalMat );

        // fromProcessor烆[U[vOf[^ւ̕ϊieNX`Wpj
        if( face.uv != null ) {
            ..._U = face.uv[ i ].u;
            ..._V = face.uv[ i ].v;
        }
    }

    // Op|SPʂ̃[v
    for( int i=0; i<fromKernel.triIndex.length; i++ ) {
        for( int j=0; j<3; j++ ) {
            // Op|S̒_CfbNX
            ... = fromKernel.triIndex[ i ].vtxNo[ j ];
        }
    }
}

// fromProcessor烆[U[vOf[^ւ̕ϊi_ʒuPʁj
public void ConvertPos( double x, double y, double z, x3pMatrix posMat )
{
    // }gbNXϊ
    ..._X = x*posMat.m[0][0] + y*posMat.m[1][0] + z*posMat.m[2][0] + posMat.m[3][0];
    ..._Y = x*posMat.m[0][1] + y*posMat.m[1][1] + z*posMat.m[2][1] + posMat.m[3][1];
    ..._Z = x*posMat.m[0][2] + y*posMat.m[1][2] + z*posMat.m[2][2] + posMat.m[3][2];
}

// fromProcessor烆[U[vOf[^ւ̕ϊi_@Pʁj
public void ConvertNormal( double x, double y, double z, x3pMatrix normalMat )
{
    // }gbNXϊ
    double  xd = x*normalMat.m[0][0] + y*normalMat.m[1][0] + z*normalMat.m[2][0];
    double  yd = x*normalMat.m[0][1] + y*normalMat.m[1][1] + z*normalMat.m[2][1];
    double  zd = x*normalMat.m[0][2] + y*normalMat.m[1][2] + z*normalMat.m[2][2];

    // @̕ϊ̒
    double  len = Math.sqrt( xd*xd + yd*yd + zd*zd );

    // @ȂAPʃxNgɂ
    if( len > 1.0e-6 ) {
        ..._X = xd / len;
        ..._Y = yd / len;
        ..._Z = zd / len;
    }
    else {
        ..._X = 0.0;
        ..._Y = 0.0;
        ..._Z = 0.0;
    }
}

}													// XVL3ExampleNX̏I[
